#include <stdio.h>
#include <allegro.h>
#include "menu.h"

#define NB_IMAGES_PERSO 7
#define NB_IMAGES_PERSO_JUMP 6

typedef struct{
    BITMAP * img_right[NB_IMAGES_PERSO];
	BITMAP * img_left[NB_IMAGES_PERSO];

    BITMAP * jump_img_right[NB_IMAGES_PERSO_JUMP];
	BITMAP * jump_img_left[NB_IMAGES_PERSO_JUMP];
	int x, y;
	int direction; // 0:right 1:left 2:up   3:dead
	int puch_left_right; //0:right 1:left

	int inJump;
	int score;
	int time;

	int inPuch;

}Perso;

typedef struct{
    BITMAP *image_right[18];
    BITMAP *image_left[18];
    int compteur;
    int x;
    int y;
    int statut;
}FireBall;

typedef struct{
    BITMAP *images[20];
    int compteur;
    int x;
    int y;
    int statut;//0:existe pas   1:apparition    2:marche_Left   3:marche_right  4:mort
}Ennemi;


void Charger_Perso(Perso *monPersonnage);
BITMAP* Charger_Background(char chemin[]);
void jouer(Perso *monPersonnage, BITMAP *monBackground);

void move_Perso(Perso *monPersonnage,int *compteur,BITMAP * monBackground);
void move_Perso_right(Perso *monPersonnage,int *compteur,BITMAP * monBackground);
void move_Perso_left(Perso *monPersonnage,int *compteur,BITMAP * monBackground);
void jump_Perso(Perso *monPersonnage,int *compteur, BITMAP *Background);

void draw_Perso(Perso *monPersonnage,FireBall *monFireBall, BITMAP *buffer, int compteur);


void puch_Perso_right(Perso *monPersonnage,int *compteur);

void Charger_FireBall(FireBall *monFireBall);

void Charger_Ennemi(Ennemi *monEnnemi);

void move_ennemi(Perso *monPersonnage, FireBall *monFireBall, Ennemi *monEnnemi, BITMAP *buffer, int intervalle);


int xScrolling=0;

int main()
{
    initialisation();
    int choix=0,quiter=0;
    Menu monMenu;
    Perso monPersonnage;
    FireBall monFireBall;
    Ennemi monEnnemi,monEnnemi2,monEnnemi3,monEnnemi4;
    BITMAP *monBackground=NULL;
    BITMAP *buffer;
    int compteur;



	buffer = create_bitmap(SCREEN_W, SCREEN_H);

    int intro;
    intro=chargerSon("test.wav");
    voice_start(intro);
    voice_set_playmode(intro, PLAYMODE_LOOP);


    int c; c=makecol(255,255,255);
    chargerMenu(&monMenu);
    compteur=0;

    BITMAP *fadit=load_bitmap("images/0.bmp", NULL);

    while(!quiter)
    {
        menu(&monMenu, &choix);

        textprintf_ex(screen,font,40,100,c,-1,"format:%d",choix);
        if(choix==0)
        {
            clear_bitmap(screen);
            Charger_Perso(&monPersonnage);
            Charger_FireBall(&monFireBall);
            Charger_Ennemi(&monEnnemi); Charger_Ennemi(&monEnnemi2); Charger_Ennemi(&monEnnemi3); Charger_Ennemi(&monEnnemi4);
            monBackground=Charger_Background("images/background/background2.bmp");
            while(!key[KEY_ESC])
            {
                clear_bitmap(buffer);

                move_Perso(&monPersonnage, &compteur, monBackground);
                blit(monBackground, buffer, xScrolling, 0, 0, 0, SCREEN_W, SCREEN_H);

    //            draw_sprite(buffer, fadit, 500,450);
                draw_Perso(&monPersonnage, &monFireBall ,buffer, compteur);
                move_ennemi(&monPersonnage, &monFireBall, &monEnnemi, buffer, 200);
                move_ennemi(&monPersonnage, &monFireBall, &monEnnemi4, buffer, 600);
                move_ennemi(&monPersonnage, &monFireBall, &monEnnemi2, buffer, 1200);
                move_ennemi(&monPersonnage, &monFireBall, &monEnnemi3, buffer, 2200);





                blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);


                if (compteur > 10000)
                        compteur = 0;



                rest(20);

            }



        }
        if(choix==2)
        {
            voice_stop(intro);
            quiter=1;
        }
    }

    destroy_menu(&monMenu);


//    destroy_bitmap(Buffer);
    return 0;
}

void Charger_Perso(Perso *monPersonnage)
{
    int i;
	char buf[200];
	for (i = 0; i < NB_IMAGES_PERSO; i++) {
		sprintf(buf, "images/perso/right%d.bmp", i);
		monPersonnage->img_right[i] = load_bitmap(buf, NULL);
		sprintf(buf, "images/perso/left%d.bmp", i);
		monPersonnage->img_left[i] = load_bitmap(buf, NULL);
	}

    for (i = 0; i < NB_IMAGES_PERSO_JUMP; i++) {
		sprintf(buf, "images/perso/jumpR%d.bmp", i);
		monPersonnage->jump_img_right[i] = load_bitmap(buf, NULL);
		sprintf(buf, "images/perso/jumpL%d.bmp", i);
		monPersonnage->jump_img_left[i] = load_bitmap(buf, NULL);
	}
	monPersonnage->x=20;
	monPersonnage->y=450;
	monPersonnage->direction=0;
	monPersonnage->inJump=0;
	monPersonnage->score=0;
	monPersonnage->time=5;
	monPersonnage->inPuch=0;
	monPersonnage->puch_left_right=0;


}

void Charger_FireBall(FireBall *monFireBall)
{
    int i;
	char buf[200];
	for (i = 0; i < 18; i++) {
		sprintf(buf, "images/fire/right/%d.bmp", i);
		monFireBall->image_right[i]= load_bitmap(buf, NULL);
		sprintf(buf, "images/fire/left/%d.bmp", i);
		monFireBall->image_left[i]= load_bitmap(buf, NULL);
	}
	monFireBall->x=0;
	monFireBall->y=0;
	monFireBall->statut=0;
	monFireBall->compteur=0;

}

void Charger_Ennemi(Ennemi *monEnnemi)
{
    int i; char buf[200];
	for (i = 0; i < 8; i++) {
		sprintf(buf, "images/ennemi1/%d.bmp", i);
		monEnnemi->images[i]= load_bitmap(buf, NULL);
	}
	monEnnemi->x=500;
	monEnnemi->y=0;
	monEnnemi->statut=0;
	monEnnemi->compteur=0;
}


BITMAP* Charger_Background(char chemin[])
{
    BITMAP *monBackground=NULL;
    monBackground=load_bitmap(chemin, NULL);
    if (monBackground == NULL)
    {
        allegro_message("could not load Background");
        allegro_exit();
    }
    return (monBackground);
}


void move_Perso(Perso *monPersonnage,int *compteur,BITMAP * monBackground)
{
    move_Perso_right(monPersonnage, compteur, monBackground);
	move_Perso_left(monPersonnage, compteur, monBackground);
	jump_Perso(monPersonnage,compteur, monBackground);

	puch_Perso_right(monPersonnage, compteur);

}

void move_Perso_left(Perso *monPersonnage,int *compteur,BITMAP * monBackground)
{
	if (key[KEY_LEFT] && monPersonnage->x > 5 && monPersonnage->direction!=3)
    {
		*compteur+=1;
		if(!xScrolling==0)
		xScrolling=xScrolling-6;

		(monPersonnage->x)-=1;
		monPersonnage->direction = 1; //left
	}

}

void move_Perso_right(Perso *monPersonnage,int *compteur,BITMAP * monBackground)
{

	if (key[KEY_RIGHT] && monPersonnage->x < 750  && monPersonnage->direction!=3)
	{
		*compteur=(*compteur)+1;
		if(xScrolling<3750)
            xScrolling=xScrolling+6;

		(monPersonnage->x)+=1;
		monPersonnage->direction = 0; //right
	}

}

void jump_Perso(Perso *monPersonnage,int *compteur, BITMAP *Background)
{
    if (key[KEY_UP] && monPersonnage->y > 0 && monPersonnage->x < 620 && monPersonnage->direction==0  )
    {
        *compteur=(*compteur)+1;
		monPersonnage->direction = 2; //jump

        monPersonnage->inJump=1;
	}
	else if(key[KEY_UP] && monPersonnage->y > 0 && monPersonnage->x > 60 && monPersonnage->direction==1 )
    {
        *compteur=(*compteur)+1;
		monPersonnage->direction = 2; //jump

        monPersonnage->inJump=1;
    }


}

void puch_Perso_right(Perso *monPersonnage,int *compteur)
{
    if(key[KEY_SPACE] && monPersonnage->inPuch==0 && monPersonnage->direction!=3)
    {
        //*compteur=(*compteur)+1;
        //monPersonnage->direction=3;
        monPersonnage->inPuch=1;
        if(monPersonnage->direction==0)
            monPersonnage->puch_left_right=0;
        else if(monPersonnage->direction==1)
            monPersonnage->puch_left_right=1;
    }
}


void draw_Perso(Perso *monPersonnage,FireBall *monFireBall, BITMAP *buffer, int compteur)
{
    static int last_direction;

    if (monPersonnage->direction == 0){ //moving right

		draw_sprite(buffer, monPersonnage->img_right[compteur % (NB_IMAGES_PERSO-1)],monPersonnage->x, monPersonnage->y);
		last_direction=0;
	}

	if(monPersonnage->direction == 1){ //moving left

		draw_sprite(buffer, monPersonnage->img_left[compteur % (NB_IMAGES_PERSO-1) ],monPersonnage->x, monPersonnage->y);
		last_direction=1;
	}
	if (monPersonnage->direction == 2 && last_direction==0) //jumping right
    {                rest(60);

        static int compteurJump=0;

		//draw_sprite(buffer, monPersonnage.jump_img_right[compteur % (NB_IMAGES_PERSO_JUMP-1)],monPersonnage.x, monPersonnage.y);
		if(compteurJump==0)
		{
		    draw_sprite(buffer, monPersonnage->jump_img_right[0],monPersonnage->x, monPersonnage->y);
            compteurJump++;
        }
        else if(compteurJump==1)
        {
            monPersonnage->x=monPersonnage->x+15;
            draw_sprite(buffer, monPersonnage->jump_img_right[1],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling+90;

            compteurJump++;
       }
        else if(compteurJump==2)
        {
            monPersonnage->x=monPersonnage->x+15;
            draw_sprite(buffer, monPersonnage->jump_img_right[2],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling+90;
            compteurJump++;

        }
        else if(compteurJump==3)
        {
            monPersonnage->x=monPersonnage->x+35;
            draw_sprite(buffer, monPersonnage->jump_img_right[3],monPersonnage->x, monPersonnage->y-70);
            xScrolling=xScrolling+210;
            monPersonnage->y=monPersonnage->y-60;
            compteurJump++;

        }
        else if(compteurJump==4)
        {
            monPersonnage->x=monPersonnage->x+35;
            draw_sprite(buffer, monPersonnage->jump_img_right[4],monPersonnage->x, monPersonnage->y-100);
            xScrolling=xScrolling+210;
            monPersonnage->y=monPersonnage->y-20;
            compteurJump++;
        }
        else if(compteurJump==5)
        {
            monPersonnage->x=monPersonnage->x+35;
            draw_sprite(buffer, monPersonnage->jump_img_right[3],monPersonnage->x, monPersonnage->y-70);
            xScrolling=xScrolling+210;
            monPersonnage->y=monPersonnage->y+20;
            compteurJump++;
        }
        else if(compteurJump==6)
        {
            monPersonnage->x=monPersonnage->x+35;
            draw_sprite(buffer, monPersonnage->jump_img_right[2],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling+210;
            monPersonnage->y=monPersonnage->y+60;

            compteurJump++;
        }
        else if(compteurJump==7)
        {
            monPersonnage->x=monPersonnage->x+15;
            draw_sprite(buffer, monPersonnage->jump_img_right[1],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling+90;
            compteurJump++;
        }
        else if(compteurJump==8)
        {
            monPersonnage->x=monPersonnage->x+15;
            draw_sprite(buffer, monPersonnage->jump_img_right[0],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling+90;
            compteurJump=0;
            monPersonnage->inJump=0;
            monPersonnage->direction=0;

        }





	}
	if (monPersonnage->direction == 2 && last_direction==1) //jumping left
    {

                rest(60);

        static int compteurJump=0;

		//draw_sprite(buffer, monPersonnage.jump_img_left[compteur % (NB_IMAGES_PERSO_JUMP-1)],monPersonnage.x, monPersonnage.y);
		if(compteurJump==0)
		{
		    draw_sprite(buffer, monPersonnage->jump_img_left[0],monPersonnage->x, monPersonnage->y);
            compteurJump++;
        }
        else if(compteurJump==1)
        {
            monPersonnage->x=monPersonnage->x-15;
            draw_sprite(buffer, monPersonnage->jump_img_left[1],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling-90;

            compteurJump++;
       }
        else if(compteurJump==2)
        {
            monPersonnage->x=monPersonnage->x-15;
            draw_sprite(buffer, monPersonnage->jump_img_left[2],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling-90;
            compteurJump++;

        }
        else if(compteurJump==3)
        {
            monPersonnage->x=monPersonnage->x-35;
            draw_sprite(buffer, monPersonnage->jump_img_left[3],monPersonnage->x, monPersonnage->y-70);
            xScrolling=xScrolling-210;
            monPersonnage->y=monPersonnage->y-60;
            compteurJump++;

        }
        else if(compteurJump==4)
        {
            monPersonnage->x=monPersonnage->x-35;
            draw_sprite(buffer, monPersonnage->jump_img_left[4],monPersonnage->x, monPersonnage->y-100);
            xScrolling=xScrolling-210;
            monPersonnage->y=monPersonnage->y-20;
            compteurJump++;
        }
        else if(compteurJump==5)
        {
            monPersonnage->x=monPersonnage->x-35;
            draw_sprite(buffer, monPersonnage->jump_img_left[3],monPersonnage->x, monPersonnage->y-70);
            xScrolling=xScrolling-210;
            monPersonnage->y=monPersonnage->y+20;
            compteurJump++;
        }
        else if(compteurJump==6)
        {
            monPersonnage->x=monPersonnage->x-35;
            draw_sprite(buffer, monPersonnage->jump_img_left[2],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling-210;
            monPersonnage->y=monPersonnage->y+60;

            compteurJump++;
        }
        else if(compteurJump==7)
        {
            monPersonnage->x=monPersonnage->x-15;
            draw_sprite(buffer, monPersonnage->jump_img_left[1],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling-90;
            compteurJump++;
        }
        else if(compteurJump==8)
        {
            monPersonnage->x=monPersonnage->x-15;
            draw_sprite(buffer, monPersonnage->jump_img_left[0],monPersonnage->x, monPersonnage->y);
            xScrolling=xScrolling-90;
            compteurJump=0;
            monPersonnage->inJump=0;
            monPersonnage->direction=1;

        }
	}


    if(monPersonnage->inPuch==1 && monPersonnage->puch_left_right==0)
    {
        static int initialiserFireBall=0;
        if(initialiserFireBall==0 || monFireBall->x==-666)
        {
            monFireBall->x= monPersonnage->x;
            initialiserFireBall=1;
        }
        //monFireBall->x=monFireBall->x;
        monFireBall->x=monFireBall->x+5;
        monFireBall->y=monPersonnage->y+10;


        draw_sprite(buffer, monFireBall->image_right[monFireBall->compteur],monFireBall->x, monFireBall->y);
        monFireBall->compteur++;
        monFireBall->compteur=monFireBall->compteur%17;;
        if(monFireBall->compteur==17) monFireBall->compteur=0;
        //rest(10);
        if(monFireBall->x>800) {monFireBall->x=0; monPersonnage->inPuch=0; initialiserFireBall=0;}
    }
    else if(monPersonnage->inPuch==1 && monPersonnage->puch_left_right==1)
    {
        static int initialiserFireBall=0;
        if(initialiserFireBall==0 || monFireBall->x==-666)
        {
            monFireBall->x= monPersonnage->x;
            initialiserFireBall=1;
        }
        //monFireBall->x=monFireBall->x;
        monFireBall->x=monFireBall->x-5;
        monFireBall->y=monPersonnage->y+10;

        draw_sprite(buffer, monFireBall->image_left[monFireBall->compteur], monFireBall->x, monFireBall->y);
        monFireBall->compteur++;
        monFireBall->compteur=monFireBall->compteur%17;;
        if(monFireBall->compteur==17) monFireBall->compteur=0;
        //rest(10);
        if(monPersonnage->x+monFireBall->x<0) {monFireBall->x=0; monPersonnage->inPuch=0;  initialiserFireBall=0;}

    }



    static int seconde=60;
    static int compteurSeconde=0;
    compteurSeconde++;
    if(compteurSeconde%50==0) seconde--;
    if(seconde==0) {seconde=60; monPersonnage->time=monPersonnage->time-1;}
    int c; c=makecol(255,255,255);
    textprintf_ex(buffer,font,650,20,c,-1,"Score  %d Kills",monPersonnage->score);
    textprintf_ex(buffer,font,650,40,c,-1,"Time  %d:%d",monPersonnage->time,seconde);


}


void move_ennemi(Perso *monPersonnage, FireBall *monFireBall, Ennemi *monEnnemi, BITMAP *buffer, int intervalle)
{
    int c; c=makecol(255,255,255);

    if(xScrolling>intervalle && xScrolling<intervalle+20 && monEnnemi->statut==0)
    {
        monEnnemi->statut=1;
    }
    if(monEnnemi->statut==1)
    {
        monEnnemi->x=monEnnemi->x-3;;
        draw_sprite(buffer, monEnnemi->images[monEnnemi->compteur], monEnnemi->x, 450);
        //textprintf_ex(buffer,font,40,100,c,-1,"ennemi : %d      perso : %d", monEnnemi->x, monPersonnage->x);
        monEnnemi->compteur++;
        if(monEnnemi->compteur==2) {monEnnemi->compteur=0;}
        if(monEnnemi->x-monPersonnage->x>5 && monEnnemi->x-monPersonnage->x<30  )
        {
            monPersonnage->direction=3;
            rest(300);
        }
        if(monEnnemi->x-monFireBall->x>5 && monEnnemi->x-monFireBall->x<30)
        {
            monEnnemi->statut=6;
            monPersonnage->inPuch=0;
            monFireBall->x=-666;
            monPersonnage->score=monPersonnage->score+10;
        }
    }

}

void jouer(Perso *monPersonnage, BITMAP *monBackground)
{

}


END_OF_MAIN();


